#ifndef esaylog_H
#define esaylog_H
#ifdef __cplusplus
extern "C"
{
#endif
    /****************************************************************/
    /*
        轻量阻塞式日志打印库 By 启凡科创。
        Version:1.0.0 2025-7-14

        使用方法：
        1.在需要打印日志的文件中包含头文件esay_log.h
        2.在需要打印日志的文件中调用esay_log_attach_print_cb函数，传入打印回调函数，回调函数原型为void (*func_write_bytes)(const char *str, size_t len);
        3.调用esay_logp、esay_logi、esay_logw、esay_loge、esay_logd函数打印日志
    */
    /****************************************************************/

#include <stdint.h>
#include <stdio.h>  //依赖库
#include <stdarg.h> //依赖库
#include <string.h>
#include <stdbool.h>

#ifndef ESAY_LOG_COMPILE_EN
#define ESAY_LOG_COMPILE_EN 1 // 0禁用库不编译，1启用
#endif

#if ESAY_LOG_COMPILE_EN
#define ESAY_LOG_PRINT_EN 1 // 是否启用PRINTF日志打印 0禁用，1启用  对于调试完成的系统，可关闭日志提高系统性能
#define ESAY_LOG_INFO_EN 1  // 是否启用INFO日志打印 0禁用，1启用  对于调试完成的系统，可关闭日志提高系统性能
#define ESAY_LOG_WARN_EN 1  // 是否启用WARN日志打印 0禁用，1启用  对于调试完成的系统，可关闭日志提高系统性能
#define ESAY_LOG_ERROR_EN 1 // 是否启用ERROR日志打印 0禁用，1启用  对于调试完成的系统，可关闭日志提高系统性能
#define ESAY_LOG_DEBUG_EN 1 // 是否启用DEBUG日志打印 0禁用，1启用  对于调试完成的系统，可关闭日志提高系统性能

#ifndef NULL
#define NULL ((void *)0)
#endif

#define pintf_buffer_size 128

    typedef enum
    {
        ESAY_LOG_PRINTF = 0x01,
        ESAY_LOG_INFO = 0x02,
        ESAY_LOG_WARNING = 0x04,
        ESAY_LOG_ERROR = 0x08,
        ESAY_LOG_DEBUG = 0x10,
        ESAY_LOG_ALL = 0x1F,
    } esay_log_type_t;

#define esay_lognop(format, ...)  // 空函数   用于屏蔽指定部分日志

#if ESAY_LOG_PRINT_EN || ESAY_LOG_INFO_EN || ESAY_LOG_WARN_EN || ESAY_LOG_ERROR_EN || ESAY_LOG_DEBUG_EN
    /**
     * @brief 注册日志输出回调函数，你可以让日志输出到任何你想查看日志的地方，比如串口、文件、屏幕等
     *
     * @param func_write_bytes
     */
    void esay_log_attach_print_cb(void (*func_write_bytes)(const char *str, size_t len));

    /**
     * @brief 设置指定类型的日志输出使能
     *
     * @param type 同时操作多个日志使能使用 | 将多个类型连接起来，比如ESAY_LOG_INFO | ESAY_LOG_WARNING
     * @param en true:使能，false:禁用
     */
    void esay_log_set_log_en(esay_log_type_t type, bool en);

    void esay_logo(const char *format, ...); // 沿用上一个输出的等级继续不带TAG输出内容且不自动换行（等于延续等级的printf）
#else
#define esay_log_attach_print_cb(func) 
#define esay_logo(format, ...) 
#define esay_log_set_log_en(type, en) 
#endif
#if ESAY_LOG_PRINT_EN
    void esay_logp(const char *format, ...); // 普通printf输出白色内容
#else
#define esay_logp(format, ...) 
#endif
#if ESAY_LOG_INFO_EN
    void esay_logi(const char *tag, const char *format, ...); // 输出绿色信息
#else
#define esay_logi(tag, format, ...) 
#endif
#if ESAY_LOG_WARN_EN
    void esay_logw(const char *tag, const char *format, ...); // 输出黄色warning
#else
#define esay_logw(tag, format, ...) 
#endif
#if ESAY_LOG_ERROR_EN
    void esay_loge(const char *tag, const char *format, ...); // 输出红色error
#else
#define esay_loge(tag, format, ...) 
#endif
#if ESAY_LOG_DEBUG_EN
    void esay_logd(const char *tag, const char *format, ...); // 输出蓝色debug
#else
#define esay_logd(tag, format, ...) 
#endif

#endif
#ifdef __cplusplus
}
#endif
#endif
